Rose::Class::MakeMethods::Generic(3pm) | User Contributed Perl Documentation | Rose::Class::MakeMethods::Generic(3pm) |
Rose::Class::MakeMethods::Generic - Create simple class methods.
package MyClass; use Rose::Class::MakeMethods::Generic ( scalar => [ 'error', 'type' => { interface => 'get_set_init' }, ], inheritable_scalar => 'name', ); sub init_type { 'special' } ... package MySubClass; our @ISA = qw(MyClass); ... MyClass->error(123); print MyClass->type; # 'special' MyClass->name('Fred'); print MySubClass->name; # 'Fred' MyClass->name('Wilma'); print MySubClass->name; # 'Wilma' MySubClass->name('Bam'); print MyClass->name; # 'Wilma' print MySubClass->name; # 'Bam'
Rose::Class::MakeMethods::Generic is a method maker that inherits from Rose::Object::MakeMethods. See the Rose::Object::MakeMethods documentation to learn about the interface. The method types provided by this module are described below. All methods work only with classes, not objects.
Example:
package MyClass; use Rose::Class::MakeMethods::Generic ( scalar => 'power', 'scalar --get_set_init' => 'name', ); sub init_name { 'Fred' } ... MyClass->power(99); # returns 99 MyClass->name; # returns "Fred" MyClass->name('Bill'); # returns "Bill"
If called with no arguments, and if the attribute was never set for this class, then a left-most, breadth-first search of the parent classes is initiated. The value returned is taken from first parent class encountered that has ever had this attribute set.
Example:
package MyClass; use Rose::Class::MakeMethods::Generic ( inheritable_boolean => 'enabled', ); ... package MySubClass; our @ISA = qw(MyClass); ... package MySubSubClass; our @ISA = qw(MySubClass); ... $x = MyClass->enabled; # undef $y = MySubClass->enabled; # undef $z = MySubSubClass->enabled; # undef MyClass->enabled(1); $x = MyClass->enabled; # 1 $y = MySubClass->enabled; # 1 $z = MySubSubClass->enabled; # 1 MyClass->enabled(0); $x = MyClass->enabled; # 0 $y = MySubClass->enabled; # 0 $z = MySubSubClass->enabled; # 0 MySubClass->enabled(1); $x = MyClass->enabled; # 0 $y = MySubClass->enabled; # 1 $z = MySubSubClass->enabled; # 1 MyClass->enabled(1); MySubClass->enabled(undef); $x = MyClass->enabled; # 1 $y = MySubClass->enabled; # 0 $z = MySubSubClass->enabled; # 0 MySubSubClass->enabled(1); $x = MyClass->enabled; # 1 $y = MySubClass->enabled; # 0 $z = MySubSubClass->enabled; # 0
If called with no arguments, and if the attribute was never set for this class, then a left-most, breadth-first search of the parent classes is initiated. The value returned is taken from first parent class encountered that has ever had this attribute set.
Example:
package MyClass; use Rose::Class::MakeMethods::Generic ( inheritable_scalar => 'name', ); ... package MySubClass; our @ISA = qw(MyClass); ... package MySubSubClass; our @ISA = qw(MySubClass); ... $x = MyClass->name; # undef $y = MySubClass->name; # undef $z = MySubSubClass->name; # undef MyClass->name('Fred'); $x = MyClass->name; # 'Fred' $y = MySubClass->name; # 'Fred' $z = MySubSubClass->name; # 'Fred' MyClass->name('Wilma'); $x = MyClass->name; # 'Wilma' $y = MySubClass->name; # 'Wilma' $z = MySubSubClass->name; # 'Wilma' MySubClass->name('Bam'); $x = MyClass->name; # 'Wilma' $y = MySubClass->name; # 'Bam' $z = MySubSubClass->name; # 'Bam' MyClass->name('Koop'); MySubClass->name(undef); $x = MyClass->name; # 'Koop' $y = MySubClass->name; # undef $z = MySubSubClass->name; # undef MySubSubClass->name('Sam'); $x = MyClass->name; # 'Koop' $y = MySubClass->name; # undef $z = MySubSubClass->name; # 'Sam'
If called with one argument, and that argument is a reference to a hash, that hash reference is used as the new value for the attribute. Returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
If called with one argument, and that argument is a reference to an array, then a list of the hash values for each key in the array is returned.
If called with one argument, and it is not a reference to a hash or an array, then the hash value for that key is returned.
If called with an even number of arguments, they are taken as name/value pairs and are added to the hash. It then returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
Passing an odd number of arguments greater than 1 causes a fatal error.
If called with one argument, and that argument is a reference to a hash, that hash reference is used as the new value for the attribute. Returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
Otherwise, the hash is emptied and the arguments are taken as name/value pairs that are then added to the hash. It then returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
Example:
package MyClass; use Rose::Class::MakeMethods::Generic ( hash => [ param => { hash_key =>'params' }, params => { interface=>'get_set_all' }, param_names => { interface=>'keys', hash_key=>'params' }, param_values => { interface=>'values', hash_key=>'params' }, param_exists => { interface=>'exists', hash_key=>'params' }, delete_param => { interface=>'delete', hash_key=>'params' }, clear_params => { interface=>'clear', hash_key=>'params' }, reset_params => { interface=>'reset', hash_key=>'params' }, ], ); ... MyClass->params; # undef MyClass->params(a => 1, b => 2); # add pairs $val = MyClass->param('b'); # 2 %params = MyClass->params; # copy hash keys and values $params = MyClass->params; # get hash ref MyClass->params({ c => 3, d => 4 }); # replace contents MyClass->param_exists('a'); # false $keys = join(',', sort MyClass->param_names); # 'c,d' $vals = join(',', sort MyClass->param_values); # '3,4' MyClass->delete_param('c'); MyClass->param(f => 7, g => 8); $vals = join(',', sort MyClass->param_values); # '4,7,8' MyClass->clear_params; $params = MyClass->params; # empty hash MyClass->reset_params; $params = MyClass->params; # undef
The hash of attributes is inherited by subclasses using a one-time copy. Any subclass that accesses or manipulates the hash in any way will immediately get its own private copy of the hash as it exists in the superclass at the time of the access or manipulation.
The superclass from which the hash is copied is the closest ("least super") class that has ever accessed or manipulated this hash. The copy is a "shallow" copy, duplicating only the keys and values. Reference values are not recursively copied.
Setting to hash to undef (using the 'reset' interface) will cause it to be re-copied from a superclass the next time it is accessed.
If called with one argument, and that argument is a reference to a hash, that hash reference is used as the new value for the attribute. Returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
If called with one argument, and that argument is a reference to an array, then a list of the hash values for each key in the array is returned.
If called with one argument, and it is not a reference to a hash or an array, then the hash value for that key is returned.
If called with an even number of arguments, they are taken as name/value pairs and are added to the hash. It then returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
Passing an odd number of arguments greater than 1 causes a fatal error.
If called with one argument, and that argument is a reference to a hash, that hash reference is used as the new value for the attribute. Returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
Otherwise, the hash is emptied and the arguments are taken as name/value pairs that are then added to the hash. It then returns a list of key/value pairs in list context or a reference to the actual hash used to store values in scalar context.
Example:
package MyClass; use Rose::Class::MakeMethods::Generic ( inheritable_hash => [ param => { hash_key =>'params' }, params => { interface=>'get_set_all' }, param_names => { interface=>'keys', hash_key=>'params' }, param_values => { interface=>'values', hash_key=>'params' }, param_exists => { interface=>'exists', hash_key=>'params' }, delete_param => { interface=>'delete', hash_key=>'params' }, clear_params => { interface=>'clear', hash_key=>'params' }, reset_params => { interface=>'reset', hash_key=>'params' }, ], ); ... package MySubClass; our @ISA = qw(MyClass); ... MyClass->params; # undef MyClass->params(a => 1, b => 2); # add pairs $val = MyClass->param('b'); # 2 %params = MyClass->params; # copy hash keys and values $params = MyClass->params; # get hash ref # Inherit a copy of params from MyClass $params = MySubClass->params; # { a => 1, b => 2 } MyClass->params({ c => 3, d => 4 }); # replace contents # MySubClass params are still as the existed at the time # they were originally copied from MyClass $params = MySubClass->params; # { a => 1, b => 2 } # MySubClass can manipulate its own params as it wishes MySubClass->param(z => 9); $params = MySubClass->params; # { a => 1, b => 2, z => 9 } MyClass->param_exists('a'); # false $keys = join(',', sort MyClass->param_names); # 'c,d' $vals = join(',', sort MyClass->param_values); # '3,4' # Reset params (set to undef) so that they will be re-copied # from MyClass the next time they're accessed MySubClass->reset_params; MyClass->delete_param('c'); MyClass->param(f => 7, g => 8); $vals = join(',', sort MyClass->param_values); # '4,7,8' # Inherit a copy of params from MyClass $params = MySubClass->params; # { d => 4, f => 7, g => 8 }
An inherited hash is made up of the union of the hashes of all superclasses, minus any keys that are explicitly deleted in the current class.
Example:
package MyClass; use Rose::Class::MakeMethods::Generic ( inherited_hash => [ pet_color => { keys_method => 'pets', delete_implies => 'delete_special_pet_color', inherit_implies => 'inherit_special_pet_color', }, special_pet_color => { keys_method => 'special_pets', add_implies => 'add_pet_color', }, ], ); ... package MySubClass; our @ISA = qw(MyClass); ... MyClass->pet_colors(Fido => 'white', Max => 'black', Spot => 'yellow'); MyClass->special_pet_color(Toby => 'tan'); MyClass->pets; # Fido, Max, Spot, Toby MyClass->special_pets; # Toby MySubClass->pets; # Fido, Max, Spot, Toby MyClass->pet_color('Toby'); # tan MySubClass->special_pet_color(Toby => 'gold'); MyClass->pet_color('Toby'); # tan MyClass->special_pet_color('Toby'); # tan MySubClass->pet_color('Toby'); # gold MySubClass->special_pet_color('Toby'); # gold MySubClass->inherit_pet_color('Toby'); MySubClass->pet_color('Toby'); # tan MySubClass->special_pet_color('Toby'); # tan MyClass->delete_pet_color('Max'); MyClass->pets; # Fido, Spot, Toby MySubClass->pets; # Fido, Spot, Toby MyClass->special_pet_color(Max => 'mauve'); MyClass->pets; # Fido, Max, Spot, Toby MySubClass->pets; # Fido, Max, Spot, Toby MyClass->special_pets; # Max, Toby MySubClass->special_pets; # Max, Toby MySubClass->delete_special_pet_color('Max'); MyClass->pets; # Fido, Max, Spot, Toby MySubClass->pets; # Fido, Max, Spot, Toby MyClass->special_pets; # Max, Toby MySubClass->special_pets; # Toby
John C. Siracusa (siracusa@gmail.com)
Copyright (c) 2010 by John C. Siracusa. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
2022-05-28 | perl v5.34.0 |