Yuki Kimoto > Simo > Simo::Manual

Download:
Simo-0.1201.tar.gz

Annotate this POD

CPAN RT

New  2
Open  0
View Bugs
Report a bug
Source  

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