
Simo::Manual - Manual for Simo

This article is under construction. please wait.

Simo simplify Object Oriented Programing.
Simo is more useful than Class::Accessor.
Simo is more simple than Moose or Mouse.
You do not learn many syntax to do Object Oriented Programing.
Let't enjoy!


You can install Simo the following way.
cpan Simo
If you install Simo into Windows. You have to install nmake program.
Simo have some relative module.

You can define accessor very simple way.
package Book;
use Simo;
sub title{ ac }
sub author{ ac }
sub price{ ac }
Book class has three accessors( title, author, price ).
All you do to define accessor is calling ac function.
new method is automatically prepared.
and use strict; use warnings;
is import into your class.
You can create object in normal way.
You can pass hash or hash ref to new method
use Book;
my $book = Book->new( title => 'Goog new', author => 'Kimoto', price => 2000 );
or
my $book = Book->new( { title => 'Goog new', author => 'Kimoto', price => 2000 } );

�t�B�[���h�̃f�t�H���g�l�̐ݒ��͈ȉ��̂悤�ɍs���܂��B
package Book;
use Simo;
sub title{ ac default => 'Good news' }
sub author{ ac default => [ 'Kimoto', 'Kishimoto' ] }
sub price{ ac default => { low => 1500, normal => 2000 } }
�t�B�[���h�ɒl���ݒ肳���Ă��Ȃ��Ƃ��ɃA�N�Z�b�T���Ăяo���� default �Ŏw�肳�ꂽ�l���g�p�����܂��B
�擾�������l�́Adefault�Ŏw�肳�ꂽ�l���R�s�[�ł��B �f�t�H���g�l�����t�@�����X�Ȃǂ́u���l�╶�����v�ȊO�̂��̂ł������ꍇ�́AStorable��clone���ɂ����Ēl���R�s�[�����܂��B �����́A�傫�ȃf�[�^�ł������ꍇ�̓I�[�o�[�w�b�h�ɂȂ肦�܂��B
�f�t�H���g�l�����t�@�����X���I�u�W�F�N�g�ł������ꍇ�́A default �ł͂Ȃ��Č��ʼn������� auto_build ���g�p���邱�Ƃ��l���ɓ����Ă��������B
�Ƃ��ɁA���̃t�B�[���h�̒l�Ɋ��Â��āA�t�B�[���h���\�z�������ꍇ�������܂��B ���Ƃ��A�t�B�[���h�ɐݒ肳�ꂽ�z�X�g������Net::FTP�I�u�W�F�N�g���\�z�������ꍇ�Ȃǂł��B
���̂悤�ȏꍇ�́Aauto_build ���g�p�����ƕ֗��ł��B auto_build �I�v�V�������w�肷���ƁA�A�N�Z�b�T���Ăꂽ�Ƃ��� �r���_�[���\�b�h�������I�ɌĂяo���Ă����܂��B
package YourApp;
use Simo;
use Net::FTP;
sub host{ default => 'some.host.name' }
sub net_ftp{ ac auto_build => 1 }
sub build_net_ftp{
my $self = shift;
$self->net_ftp( Net::FTP->new( $self->host ) );
}
�r���_�[���\�b�h�́Abuild_net_ftp �̂悤��
build_�A�N�Z�b�T��
�ɂ����K�v�������܂��B
2���ڈڍs�̃t�B�[���h�ւ̃A�N�Z�X�́A�r���_�[���\�b�h�ɂ����Đݒ肳�ꂽ�l���g�p�����܂��B
�܂�buildr_xxx�Ƃ������O���D�܂Ȃ��Ȃ��Aauto_build�I�v�V�����ɃT�u���[�`�����w�肷�邱�Ƃ��ł��܂��B
sub net_ftp{ ac auto_build => \&create_net_ftp }
sub create_net_ftp{
# ...
}
�t�B�[���h�ɐ����������������ꍇ�������܂��B ���l���������ꂽ���������A�����̃N���X�̃I�u�W�F�N�g���������ꂽ�������肷���ꍇ�ł��B
���̂悤�ȏꍇ�́Aconstrain ���g�p���܂��B constarin �ɂ́A�D���Ȑ��������n�����Ƃ��ł��܂����A �ʏ��́ASimo::Constrain �ɐ����̂��߂̊����p�ӂ����Ă����̂ł������g���܂��B
package Book;
use Simo;
use Simo::Constrain qw( is_str is_int isa );
sub title{ ac constrain => \&is_str }
sub author{ ac constrain => sub{ isa 'Person' } }
sub price{ ac constrain => \&is_int }
title�ɐݒ��ł����̕������Aauthor�ɐݒ��ł����̂�Person�N���X�̃I�u�W�F�N�g�����A price�ɐݒ��ł����̂͐����l�����Ƃ������悤�ɁA�t�B�[���h�ɐݒ��ł����l�������ł��܂��B
���������Ɉᔽ�����A���O���������v���O�����͏I�����܂��B �ȉ��̂悤�ȃ��b�Z�[�W���\�������܂��B
Book::price must be integer.( this value is bad ) at b.pl line 6
Simo�̓t�B�[���h�ɐ����ᔽ���N�������Ƃ��ɗ��O�𓊂��܂��B ���̗��O�͒P�Ȃ镶�����ł͂Ȃ��āASimo::Error�I�u�W�F�N�g�ł��B
���̃I�u�W�F�N�g�́A�����ᔽ���N�������t�B�[���h���A�ݒ肳�ꂽ�l�Ȃǂ̏����������Ă��܂��B
���̃I�u�W�F�N�g�̏������������Ƃ��́ASimo::Util �� err �����g�p���܂��B
�ȉ��̗��ł́Aprice�ɐ����ȊO���n�����̂ŗ��O���������܂��B ���̗��O��eval�ŃL���b�`�������Aerr ���œ��e���擾���邱�Ƃ��ł��܂��B
use Book;
use Simo::Util qw( err );
my $book = eval{ Book->new( price => 'string', title => 'Good news' ) };
if( my $err = err ){
my $type = $err->type; # ���O�̎���
my $msg = $err->msg; # ���O���b�Z�[�W
my $pos = $err->pos; # ���O���N�������ꏊ
my $pkg = $err->pkg; # ���O���N�������p�b�P�[�W��
my $attr = $err->attr # ���O���N�������t�B�[���h��
my $val = $err->val; # ���O�̌����ɂȂ����l
if( $attr eq 'price' ){
# ���肽���G���[�������s���B
}
else( $attr eq 'title' ){
# ...
}
else{
# ...
}
}
�ǂ̃t�B�[���h���Ő����ᔽ���N�����āA���ꂪ�ǂ̂悤�Ȓl�Ȃ̂����擾�ł��邽�� �ڍׂȃG���[�������s�����Ƃ��ł��܂��B
�G���[�I�u�W�F�N�g�ɂ��Ă� Simo::Error ���Q�Ƃ��Ă��������B
�����Ǝ��ɐ������������������Ȃ��Ή\�ł��B Simo�̐������Ɠ����쐬���@�ŁA���������쐬�����Δ����ɒ��a�̎��ꂽ���̂ɂȂ��܂��B
Simo::Constrain��is_define���̎��������Ƃ��Čf�ڂ��Ă����܂��B
sub is_defined(;$){
my $val = shift || $_;
defined($val) or $@ = "must be defined.( undef is bad )", return 0;
return 1;
}
�������́A�������������g�p���A�Ȃ����f�t�H���g�ϐ� $_ ���g�p�����悤�ɂ��܂��B ���̂悤�ɋL�q�����A
sub title{ ac constrain => sub{ is_defined } }
�̂悤�Ɉ������ȗ������L�q���\�ɂȂ��܂��B
���������Ȃ������ꍇ�́A$@ �Ƀ��b�Z�[�W���ݒ肵�āA�U�l���ԋp���Ă��������B ���̃��b�Z�[�W�̓G���[���b�Z�[�W�Ƃ��Ďg�p�����܂��B
�����������ꍇ�́A�^�l���ԋp���Ă��������B
���������̐������L�q�������ꍇ��2�̕��@�������܂��B
�ЂƂ߂́A�����T�u���[�`���Ƃ��Ď������邱�Ƃł��B �ȉ��̗���Book�N���X��Cloneable�N���X���p�����Ă��邱�Ƃ��ۏႷ�����ł��B
sub title{ ac constain => sub{ isa Book && isa Cloneable } }
�����ЂƂ́A�z���̃��t�@�����X�ɕ����̐��������n�����@�ł��B
sub title{ ac constrain => [ \&is_xxx, \&is_yyy, \&is_zzz ] }
�����A�ݒ肳�����l�ɉ��炩�̏������{�������̂Ȃ�filter���g�p���Ă��������B
�ȉ��̗��ł͐ݒ肳�����l���啶���ɂ��܂��B
package Book;
use Simo;
sub title{ ac filter => sub{ uc } }
�����ЂƂ����̃X���b�V�������菜�����������Ă����܂��B
package Book;
use Simo;
sub dir{ ac filter => \&remove_last_slash }
sub remove_last_slash{
my $val = shift;
$val =~ s#/$##;
return $val;
}
�t�B���^�̂��߂̊��������ꍇ�́A�t�B���^���̒l��return�ŕԋp�����悤�ɂ��Ă��������B
�t�B���^�������Ɠ����悤�ɕ������ׂ邱�Ƃ��ł��܂��B
sub title{ ac filter => [ \&filter_xxx, \&fitler_yyy, \&filter_zzz ] }
�g���K�Ƃ�Simo�ł́A�l���ݒ肳�ꂽ�ꍇ�Ɏ��s�����郁�\�b�h�̂��Ƃ������܂��B
���Ƃ��A�����l�ɕύX�����������A���炩�̏��������s�������ꍇ�Ƀg���K�͕֗��ł��B
�ЂƂ̗��Ƃ��āAGUI�ł̃v���O���~���O�ŁA �F�̒l���ύX���ꂽ���ĕ`�������������Ăяo�������ꍇ�Ȃǂ����������܂��B
package Button;
use Simo;
sub color{ ac trigger => \&paint }
sub paint{
# �ĕ`���̏���
}
�g���K���A�������t�B���^�Ɠ����悤�ɕ����Ȃ��ׂ邱�Ƃ��ł��܂��B
sub coloer{ ac tirgger => [ \&trigger_xxx, \&trigger_yyy, \&trigger_zzz ]
�ǂݎ������p�̃A�N�Z�b�T���쐬�����ɂ́Aread_only���g�p���܂��B
package Book;
use Simo;
sub title{ ac default => 'Good news', read_only => 1 }
�ǂݎ������p�̃A�N�Z�b�T�́A�l���ݒ肳���悤�Ƃ����Ƃ��ɁA���O�������܂��B
���ʓI�ɂ́Adefault �Ƒg�ݍ��킹�Ďg�p���܂��B
Simo�ɂ́A�A�N�Z�b�T�ɐݒ肳�����l�͕K���X�J���[�ł��B�܂��擾�����ꍇ���K���X�J���[�ɂȂ��܂��B
�z�����ݒ肷�邱�Ƃ��n�b�V�����ݒ肷�邱�Ƃ͂ł��܂����B
�A�N�Z�b�T�ɔz�n���ꂽ�ꍇ�͂ǂ��Ȃ��ł��傤��?
my $book = Book->new;
$book->author( 'Kimoto', 'Kenta', 'Mori' );
���̂悤�ȏꍇ�́A�����I�ɔz���̃��t�@�����X�ւƕϊ������܂��B
�܂��A�ݒ肳�����i�K�ł́A
[ 'Kimoto', 'Kenta', 'Mori' ]
�ɂȂ��܂��B
���Ƃ�
$book->author( main => 'Kimoto', sub => 'Kenta' );
�̂悤�Ƀn�b�V�����ݒ肷���悤�ɈӐ}���Ă����Ƃ��Ă�
{ main => 'Kimoto', sub => 'Kenta' }
�ł͂Ȃ�
[ 'main', 'Kimoto', 'sub', 'Kenta' ]
�̂悤�ɕϊ������܂��B
�����Ńn�b�V���Ƃ��ĉ��߂��Ăق����ꍇ�͈ȉ��̂悤��hash_force���g�p���܂��B
package Book;
use Simo;
sub author{ ac hash_force => 1 }

Simo�Ōp�����s���ɂ͈ȉ��̂悤�ɂ��܂��B Book�Ƃ����N���X���p�����āAMagazine�Ƃ����N���X���쐬�������ł��B
package Magazine;
use Simo( base => 'Book' );
base ���W���[�����g���̂ł͂Ȃ����Ƃɒ��ӂ��Ă��������B �����I�ɂ�base ���W���[�����Ă��ł����̂ł����A�p���̏������ۏႷ�邽�߂ɂ��̋L�q���s���Ă��������B
Simo�͋L�@���Ń~�b�N�X�C�����T�|�[�g���܂��B
�ȉ��̗��́AClass::Cloneable��<Class::Comparable> ���~�b�N�X�C���������ł��B
package Book;
use Simo( mixin => [ 'Class::Cloneable', 'Class::Comparable' ] );
Simo�̃~�b�N�X�C���́A�������ʂȂ��Ƃ͂��܂����BSimo�̃~�b�N�X�C���͒P�Ȃ鑽�d�p���ł��B
�����ǂ��A�N���X���������l�́A���d�p�����Ӑ}�������̂ł͂Ȃ��A�~�b�N�X�C�����Ӑ}�������̂� �Ƃ������Ƃ��`���邱�Ƃ��ł��܂��B
�܂��A�������̃N���X�̓R���X�g���N�^���������A�����������ׂ����\�b�h�����邩�������Ȃ��Ƃ��� ���Ƃ��g�p�҂Ɋ��������邱�Ƃ��ł��܂��B
�������x�Șb���ł��B�ǂݔ����Ă����܂��܂����B
�����������玞�ɃI�[�o�[���C�h�\�ȃR���X�g���N�^�������������Ȃ��ꍇ�����邩�������܂����B
���ꂪ�A�ǂ̂悤�ȏꍇ���z�肵�Ă��邩�Ƃ����ASimo�ō쐬�����Ă��Ȃ��N���X���p���������ꍇ�ł��B
�����������܂��傤�BCGI::Application ���p�����ĐV�����N���X�����肽���Ƃ��܂��B
use MyApp;
use Simo( base => 'CGI::Application' );
sub app_name{ ac }
���̂悤�ɃN���X���쐬�����ꍇ�A�����ɂȂ��̂́Aapp_name�̏����ł��Ȃ��Ƃ������Ƃł��B
new�ɌĂ����R���X�g���N�^�́ACGI::Application�̂��̂ł����ASimo�̂��̂ł͂����܂����B
my $myapp = MyApp->new( app_name => 'YHA' );
�̂悤�ɋL�q���邱�Ƃ��ł��Ȃ��̂ł��B
�����������s���邽�߂ɂ́A�e�̃R���X�g���N�^�����s���ăI�u�W�F�N�g�����Ă����A ���̃I�u�W�F�N�g��app_name���������K�v�������܂��B
CGI::Application�̃R���X�g���N�^�ł́ATMPL_PATH, PARAMS, QUERY �������邱�Ƃ��ł��܂��B Simo�̃R���X�g���N�^�ł́Aapp_name�������邱�Ƃ��ł��܂��B
���̍��̂��s���͔̂����ɖʓ|�ł��BSimo�́A���̋��J���ł��邾�����菜�����߂ɁA new_self_and_parent�Ƃ������\�b�h�������Ă��܂��B
�e�̃R���X�g���N�^�����s���Ȃ����ASimo�̃R���X�g���N�^�����s�����ɂ́A�ȉ��̂悤�ɂ��܂��B
package MyApp;
use Simo( base => 'CGI::Application' );
sub new{
my $self = shift->new_self_and_parent( @_, [ 'TMPL_PATH', 'PARAMS', 'QUERY' ] );
return $self;
}
new_self_and_parent �̑�2�����ɂ́A�e�̃R���X�g���N�^�̏������p�����[�^���z���̃��t�@�����X�Ŏw�肵�܂��B
�����L�q�����A
my $myapp = MyApp->new( app_name => 'YHA', TMPL_PATH => 'xxx', PARAMS => {} QUERY => CGI->new );
�̂悤�ɁA�e�̃R���X�g���N�^��Simo�̃R���X�g���N�^���Ɏ��s���邱�Ƃ��\�ł��B
�����āA���Ȃ��́ACGI::Application�p�̃R���X�g���N�^�Ƃ��āA���������֗��Ȃ��̂��ł��邩�������܂����B
�����Ȃ��A�������R���X�g���N�^�݂̂̃N���X�ɂ��Č��܂��傤�B
package Simo::New::CGI::Application;
sub new{
my $self = shift->new_self_and_parent( @_, [ 'TMPL_PATH', 'PARAMS', 'QUERY' ] );
# ���������֗��Ȃ��Ƃ��s���B
return $self;
}
�����Ă��̂悤�ɂ��č쐬�����Ȃ��A
package MyApp;
use Simo( base => 'CGI::Application', new => 'Simo::New::CGI::Application' );
�Ƃ����ӂ���new���\�b�h���C���|�[�g���邱�Ƃ��ł��܂��B�����͂����Ɍp���\�ł����āA
package MyApp;
use Simo( base => 'CGI::Application', new => 'Simo::New::CGI::Application' );
sub new{
my $self = shift->SUERP::new( @_ );
# ���[�U���D���Ȃ��Ƃ������B
return $self;
}
�̂悤�ɗ��p���邱�Ƃ��ł��܂��B
�������Ɠ���B
new�̃I�[�o�[���C�h�ɂ��ď����Ă����܂��B
Simo�ɂ����Ď����I�ɗp�ӂ��ꂽnew�́A�I�[�o�[���C�h���邱�Ƃ��ł��܂��B
�����́AClass::Accessor�ɑ����傫�ȗ��_�ł��B
�܂��Anew���I�[�o�[���C�h���邱�Ƃ𐄏����Ȃ�Moose��Mouse�ɑ��Ă��傫�ȗ��_�ł��B
Perl�ŃI�u�W�F�N�g�w�����w���ł����m����Simo�ł͎��R�ɗ��p���邱�Ƃ��ł��܂��B
new�̃I�[�o�[���C�h�̐��`�͈ȉ��̂悤�ɂȂ��܂��B
package Book;
use Simo;
sub new{
my $self = shift->SUERP::new( @_ );
# �D���Ȃ��Ƃ������B
return $self;
}

���Ƃ���title��author�����t�B�[���h���K�v�s���Ȃ����������܂��B
REQUIRED_ATTRS�Ƃ������\�b�h���I�[�o�[���C�h���Ă��������B
package Book;
use Simo;
sub title{ ac }
sub author{ ac }
sub REQUIRED_ATTRS{ qw/title author/ }
���̂悤�ɋL�q�����A
my $book = Book->new;
�̂悤�ȋL�q�������Ƃ��ɁA���O�𓊂��Ă����܂��B
���̂Ƃ��̃G���[�̃^�C�v��
attr_required
�ɂȂ��܂��B
���z�Ƃ��ẮA sub title{ ac required => 1 } �Ƃ����L�q�������������B
�����ǂ��ASimo�̃A�N�Z�b�T�͕K���x���ŕ]�������邽�߁A�R���X�g���N�^���Ăяo���ꂽ���_�ł́A ���ꂪ�A�K�v�s���Ȃ̂��ǂ������ł��܂����B
���̂��߂ɁAREQUIRED_ATTRS ���I�[�o�[���C�h�����Ƃ������������Ƃ��܂����B
�X�y�����O�̃~�X�ɔ����ɋC�����Ă�������( �e�ՂɊԈႦ�Ă��܂��܂��B)
���L��Book�N���X���p������Magazine�Ƃ����N���X���쐬�����ꍇ�A�K�v�s���ȃt�B�[���h�̒��`�������@���������܂��B
�����Ŕ����ɊԈႢ�₷�����Ƃ������܂��Btitle, auhtor, price ��3�̃t�B�[���h���K�v�s���ɂ��邽�߂ɁA
package Magazine;
use Simo( base => 'Book' );
sub price{ ac }
sub REQUIRED_ATTRS{ 'price' }
�Ə����Ă��܂��Ă͊ԈႢ�ł��B
REQUIRE_ATTRS�̓I�[�o�[���C�h�����邽�߂ɁAprice�������K�v�s���ȃt�B�[���h�ɂȂ��Ă��܂��܂��B
���������́A
sub REQUIRED_ATTRS{ qw/title author price/ }
�Ə����K�v�������܂��B
�ł��������āA�ʓ|�����ˁB
�����ŁASimo�͊ȈՂȋL�q���p�ӂ��Ă��܂��B
sub REQUIRED_ATTRS{ 'price', and_super }
and_super ���\�b�h���ĂԂƃX�[�p�[�N���X�̃��\�b�h���Ă��A 'title' �� 'author' ���ԋp�����܂��B

������Simo�̋@�\�̈��ʂ��̉������I�����܂����B
�����܂ł́A�N���X�̍������̉����ł����B
����Simo�ł́A�N���X�����邾���ł͂Ȃ��A�I�u�W�F�N�g���g�����ɂ��z�����������ɂȂ��Ă��܂��B
�����̃t�B�[���h�̒l���ݒ肷���ɂ͈ȉ��̂悤�ɂ��܂��B
use Simo::Util 'o';
my $book = Book->new;
$book->set_values( title => 'Good news', author => 'Kimoto' );
�ŁA�����̃t�B�[���h�ɒl���ݒ肷�邱�Ƃ��ł��܂��B
�����̃t�B�[���h�����l�������o���ɂ͈ȉ��̂悤�ɂ��܂��B
my ( $title, $auhtor ) = $book->get_values( qw/title author/ );
�n�b�V���X���C�X�̂悤�Ɏg�p�ł��܂��B
�����̃t�B�[���h�����l���n�b�V���̃��t�@�����X�Ƃ��Ď����o�����Ƃ��ł��܂��B
my $hash = $book->get_hash( qw/title author/ );
�����ꂽ�n�b�V���̃��t�@�����X��
{
title => 'xxx',
author => 'yyy'
}
�̂悤�ɂȂ��܂��B
�I�u�W�F�N�g�̃R�s�[���쐬�����ɂ�
my $book_copy = $book->clone
�Ƃ��܂��B�����I�ɂ́AStorable �� dclone�����g�p�����Ă��܂��B
�I�u�W�F�N�g���V���A���C�Y�����ɂ́A
my $book_str = $book->freeze;
�ŃV���A���C�Y�����ɂ́A
my $book = Simo->thaw( $book_str );
�Ƃ��܂��B
�V���A���C�Y�Ƃ����̂́A�I�u�W�F�N�g���ۑ��ł����悤�ɕ����������̂ł��B
�f�V���A���C�Y�Ƃ����̂́A�������I�u�W�F�N�g�ւ̕����̂��Ƃł��B
�����I�ɂ́AStorable�� freeze����thaw�����g�p���Ă��܂��B
�I�u�W�F�N�g�ɐݒ肳�ꂽ�l���L�����ǂ������m�F�����ɂ́A
$book->validate(
title => sub{ length $_ < 100 },
price => sub{ $_ > 0 }
);
�Ƃ��܂��B
�L�����ǂ������m�F���������U���Ԃ����Ƃ��́A���O�𓊂��܂��B
���̂Ƃ��������������O�́A Simo::Error �I�u�W�F�N�g�ɂȂ��܂��B
�G���[�̃^�C�v�́A
value_invalid
�ɂȂ��܂��B
eval�ň͂��ė��O���E���ɂ́ASimo::Util�� err �����g���܂��B
Simo::Util qw( o err );
eval{
$book->validate(
title => sub{ length $_ < 100 },
price => sub{ $_ > 0 }
);
};
if( my $err = err ){
if( $err->attr eq 'title' ){
}
elsif( $er->attr eq 'author' ){
}
esle{
}
}
���̂悤��validate���\�b�h��err�����g�p�����ƁA �t�B�[���h�̒l���ƂɃG���[���`�F�b�N���邱�Ƃ��ł��܂��B
new �� validate ���ɍs�����ƕ֗��ȏꍇ�������܂��B
my $q; # �O���������������l�B
my $book = Book->new_and_validate(
title => $q->{ title }, sub{ length $_ < 100 },
author => $q->{ author }, sub{ $_ > 0 }
);
���̂悤�ɃI�u�W�F�N�g�������Ȃ����A�l�̗L�����̃`�F�b�N�������ɂł��܂��B
���O���ߊl����eval���g�ݍ��킹�Ĉȉ��̂悤�ɏ����ƕ֗��ł��B
my $book = eval{
Book->new_and_validate(
title => $q->{ title }, sub{ length $_ < 100 },
author => $q->{ author }, sub{ $_ > 0 }
)
};
���̃��\�b�h�͕K��3�g�ŋL�q�����K�v�������܂��B
�������݂������Ȃ��ꍇ�́A
my $book = Book->new_and_validate(
price => $q->{ price }, sub{ 1 }
);
sub{ 1 } ���n���܂��B
�܂��A���̃��\�b�h�͂����ЂƂ̋L�@�������܂��B�ӂ��̃n�b�V�����t�@�����X���n�����@�ł��B
my $book = Book->new_and_validate(
{
title => $q->{ title },
author => $q->{ author },
},
{
title => sub{ $_ > 0 },
author => sub{ length $_ < 100 }
}
);
���\�b�h���A�����Ď��s�����ɂ́Arun_methods ���g�p���܂��B
���Ƃ��A�f�[�^���I�������悤�ȋL�@�������\�b�h�ɑ��ĘA���I�Ɏ��s�����Ƃ��ɕ֗��ł��B
���̃`�F�[���̓��\�b�h�`�F�[�����ӎ����č������܂����B
���\�b�h�`�F�[���������֗��ȓ_�́A���\�b�h�̎��s���\���������Ă��邽�߂ɁA���̃f�[�^�ƘA�g���₷���_�ł��B
my $result = $book_list->run_methods(
find => [ 'author' => 'kimoto' ],
sort => [ 'price', 'desc' ],
'get_result'
);
�����̃t�B�[���h�̒l���ʂ̒l�ɕϊ��������Ƃ��́Afilter_values���g�p���܂��B
$book->filter_valuse( sub{ uc }, qw/title, author/ );
���̂悤�ɋL�q�����ƁAtitle �� author �̃t�B�[���h�̒l���啶���ɕϊ������܂��B
���̃��\�b�h�̂����ЂƂ̓����Ƃ��āA�t�B�[���h�̒l���z�����ꍇ�͂��̒l�� ���ׂĂ��ϊ����Ă����Ƃ������̂������܂��B
�܂��t�B�[���h�̒l���n�b�V���������ꍇ�ɁA�n�b�V���̒l�̂��ׂĂ��ϊ����Ă����܂��B
package Book;
use Simo;
sub title{ ac default => { main => 'Good nesw', sub => 'yha' } }
sub author{ ac default => [ 'Kimoto', 'Taro' ] }
���Ƃ��Ώ��L�̂悤�ȃt�B�[���h�ł������ꍇ�́A
$book->filter_values( sub{ uc }, qw/title author/ );
�Ƃ����ƁA�z���̑S���̒l�ƁA�n�b�V���̑S���̒l���啶���ɕϊ������܂��B
���L�́Afilter_values ��encode��, decode�����K�p�������̂��A�p�ӂ����Ă��܂��B
$book->encode_values( 'utf8', q/title author/ );
$book->decode_values( 'utf8', q/title author/ );
�̂悤�Ɏg�p���܂��B
XML�����I�u�W�F�N�g�������邱�Ƃ��ł��܂��B
�ȉ���XML�����Ă��������B�܂��ŃI�u�W�F�N�g�̂悤��XML�ł��B
<?xml version="1.0" encoding='UTF-8' ?>
<root __CLASS="Book" >
<title>Good man</title>
<author __CLASS="Person">
<name>Kimoto</name>
<age>28</age>
<country>Japan</country>
</author>
</root>
�N���X���̕\����
__CLASS="Book"
�Ƃ������̂��g�����Ă��܂��B
my $book = Simo->new_from_xml( $xml );
�Ƃ����L�q�ł��̂悤��XML�����͂��āA�I�u�W�F�N�g�����邱�Ƃ��ł��܂��B
$book->author->name;
�̂悤�ɐ[���K�w�̃I�u�W�F�N�g���������ꗘ�p�ł��܂��B
�R���X�g���N�^����new�ł͂Ȃ��ꍇ�́A
<root __CLASS="Book" __CLASS_CONSTRUCTOR="create" >
</root>
�̂悤�ɁA__CLASS__CONSTRUCTOR �� �R���X�g���N�^�����w�肵�Ă��������B
�g�����́Anew_from_xml �Ƃ悭���Ă��܂��B
Book�I�u�W�F�N�g�͍쐬�����Ă��āA ���L�̂悤�ȃf�[�^���I�u�W�F�N�g�ɐݒ肵�����ꍇ�ȂǂɎg�p���܂��B
<?xml version="1.0" encoding='UTF-8' ?>
<root>
<title>Good man</title>
<author __CLASS="Person">
<name>Kimoto</name>
<age>28</age>
<country>Japan</country>
</author>
</root>
�ȉ����T���v���ł��B
my $book = Book->new;
$book->set_values_from_xml( $xml );

�Ō��܂œǂ��ł����Ă��肪�Ƃ��������܂��B