NAME
Simo::Manual - Manual for Simo
CAUTION
This article is under construction. please wait.
What is Simo?
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!
FEATURES
- 1. Can create accessors very simple way.
- 2. new method is prepared.
- 3. Can arrange accessor.( defalt value, constarant value or etc )
- 4. Can catch error object and get many information of error.
1. Install of Simo
1-1. Install of Simo
You can install Simo the following way.
cpan Simo
If you install Simo into Windows. You have to install nmake program.
1-2. Relative module of Simo
Simo have some relative module.
- 1. Simo::Error - create error object to get many information of error
- 2. Simo::Util - provide useful functions to manipulate of object
- 3. Simo::Constrain - constrain value when value is set through accessor
2. Class creating
2-1. Class creating and definition of accessor
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.
2-2. Creating object
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 } );
3. �A�N�Z�b�T�̃I�v�V����
3-1. �t�B�[���h�̃f�t�H���g�l default
�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
3-2. �t�B�[���h�̍\�z auto_build
�Ƃ��Ɂ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{
# ...
}
3-3-1. �t�B�[���h�̐��� constrain
�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
3-3-2. ����ᔽ�ɂɑ����O����
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
3-3-3 �Ǝ��̐�����̎��
���Ǝ��ɐ���������������Ȃ�Ή\�ł��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
3-3-4 �����̐����L�q�����@
�������̐����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 ] }
3-4-1. �t�B�[���h�l�̃t�B���^�[ filter
���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
3-4-2 �����̒l�̃t�B���^
�t�B���^����Ɠ����悤�ɕ�����ׂ邱�Ƃ��ł��܂��B
sub title{ ac filter => [ \&filter_xxx, \&fitler_yyy, \&filter_zzz ] }
3-5-1 �l���ݒ肳�ꂽ�ꍇ�̃g���K trigger
�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{
# �ĕ`��̏���
}
3-5-2 �����̃g���K
�g���K��A�����t�B���^�Ɠ����悤�ɕ����Ȃ�ׂ邱�Ƃ��ł��܂��B
sub coloer{ ac tirgger => [ \&trigger_xxx, \&trigger_yyy, \&trigger_zzz ]
3-6 �ǂݎ���p�̃A�N�Z�b�T read_only
�ǂݎ���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
3-6 �n�b�V���Ƃ��Ẳ�߂������Bhash_force
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 }
4.�p��
4-1 �p�� base
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
4-2 �~�b�N�X�C�� mixin
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
4-3 �I�[�o�[���C�h�\�ȃR���X�g���N�^�̎�� new
�������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
4-4 new��I�[�o�[���C�h����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;
}
5. ���̑��̋@�\
5-1 �K�v�s���ȃt�B�[���h
���Ƃ���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)
5-2 �K�v�s���ȃt�B�[���h�ƌp���̖��
��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
6. �I�u�W�F�N�g��֗��ɑ��삷��
�����Simo�̋@�\�̈�ʂ�̉���I���܂����B
�����܂ł́A�N���X�̍���̉��ł����B
���Simo�ł́A�N���X���邾���ł͂Ȃ��A�I�u�W�F�N�g��g�����ɂ�z����������ɂȂ�Ă��܂��B
6-1. �����̃t�B�[���h�ɒl��ݒ肷��B set_values
�����̃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
6-2. �����̃t�B�[���h����l����o���B get_values
�����̃t�B�[���h����l����o���ɂ͈ȉ��̂悤�ɂ��܂��B
my ( $title, $auhtor ) = $book->get_values( qw/title author/ );
�n�b�V���X���C�X�̂悤�Ɏg�p�ł��܂��B
6-3 �����̃t�[���h����l��n�b�V���̃��t�@�����X�Ƃ��Ď��o���B get_hash
�����̃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
6-3. �I�u�W�F�N�g�̃R�s�[��쐬����B clone
�I�u�W�F�N�g�̃R�s�[��쐬����ɂ�
my $book_copy = $book->clone
�Ƃ��܂��B���I�ɂ́AStorable �� dclone�����g�p����Ă��܂��B
6-4. �I�u�W�F�N�g��V���A���C�Y�܂��̓f�V���A���C�Y����B freeze, thaw
�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
6-5 �I�u�W�F�N�g�ɐݒ肳�ꂽ�l���L��ǂ�����m�F����B validate
�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
6-6 new ���ē����ɁAvalidate����B new_and_validate
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 }
}
);
6-7 ���\�b�h��A������s����B run_methods
���\�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'
);
6-8 �����̃t�B�[���h�̒l��t�B���^����B filter_values
�����̃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
6-9 �����̃t�B�[���h�̒l��G���R�[�h�A�܂��̓f�R�[�h����B encode_values, decode_values
��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
6-9 XML����I�u�W�F�N�g������B new_from_xml
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
6-10 XML��ɃI�u�W�F�N�g�̃t�B�[���h�l��ݒ肷��B set_values_from_xml
�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 );
7. �Ō��
�Ō�܂œǂ�ł���Ă��肪�Ƃ��������܂��B