Rose::Class::MakeMethods::Set(3pm) | User Contributed Perl Documentation | Rose::Class::MakeMethods::Set(3pm) |
Rose::Class::MakeMethods::Set - Create class methods to manage sets.
package MyClass; use Rose::Class::MakeMethods::Set ( inheritable_set => [ required_name => { add_implies => 'add_valid_name', test_method => 'name_is_required', }, ], inherited_set => [ valid_name => { test_method => 'name_is_valid', }, ], ); ... package MySubClass; our @ISA = qw(MyClass); ... MyClass->add_valid_names('A', 'B', 'C'); MyClass->add_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,B,C,D'; $r2 = join(',', MySubClass->required_names); # 'D' MySubClass->add_required_names('X', 'Y'); $v2 = join(',', MySubClass->valid_names); # 'A,B,C,D,X,Y'; $r2 = join(',', MySubClass->required_names); # 'D,X,Y' MySubClass->delete_valid_names('B', 'X'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'D,X,Y' MySubClass->delete_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'X,Y'
Rose::Class::MakeMethods::Set 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.
The set is inherited by subclasses, but any subclass that accesses or manipulates the set in any way will immediately get its own private copy of the set as it exists in the superclass at the time of the access or manipulation. The superclass from which the set is copied is the closest ("least super") class that has ever accessed or manipulated this set.
These may sound like wacky rules, but it may help to know that this family of methods was created for use in the Rose::HTML::Objects family of modules to manage the set of required HTML attributes (and their optional default values) for various HTML tags.
Example:
package MyClass; use Rose::Class::MakeMethods::Set ( inheritable_set => [ valid_name => { test_method => 'name_is_valid', delete_implies => 'delete_required_name', }, required_name => { add_implies => 'add_valid_name', test_method => 'name_is_required', }, ], ); package MySubClass; our @ISA = qw(MyClass); ... MyClass->add_valid_names('A', 'B', 'C'); MyClass->add_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,B,C,D'; $r2 = join(',', MySubClass->required_names); # 'D' MySubClass->add_required_names('X', 'Y'); $v2 = join(',', MySubClass->valid_names); # 'A,B,C,D,X,Y'; $r2 = join(',', MySubClass->required_names); # 'D,X,Y' MySubClass->delete_valid_names('B', 'X'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'D,Y' MySubClass->delete_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'Y' MyClass->name_is_required('D'); # true MySubClass->name_is_required('D'); # false $h = MyClass->valid_names_hash; # Careful! This is the actual hash used for set storage! # You should use delete_valid_name() instead! delete $h->{'C'}; MySubClass->required_name_value(Y => 'xval'); print MySubClass->required_name_value('Y'); # 'xval' %r = MySubClass->required_names_hash; print $r{'Y'}; # 'xval' # Okay: %r is a (shallow) copy, not the actual hash delete $r{'Y'};
An inherited set is made up of the union of the sets of all superclasses, minus any items that are explicitly deleted in the current class.
Example:
package MyClass; use Rose::Class::MakeMethods::Set ( inherited_set => [ valid_name => { test_method => 'name_is_valid', delete_implies => 'delete_required_name', inherit_implies => 'inherit_required_name', }, required_name => { add_implies => 'add_valid_name', test_method => 'name_is_required', }, ], ); ... package MySubClass; our @ISA = qw(MyClass); ... MyClass->add_valid_names('A', 'B', 'C'); MyClass->add_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D'; $r1 = join(',', MyClass->required_names); # 'D' $v2 = join(',', MySubClass->valid_names); # 'A,B,C,D'; $r2 = join(',', MySubClass->required_names); # 'D' MyClass->add_required_names('X', 'Y'); $v2 = join(',', MySubClass->valid_names); # 'A,B,C,D,X,Y'; $r2 = join(',', MySubClass->required_names); # 'D,X,Y' MySubClass->delete_valid_names('B', 'X'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D,X,Y'; $r1 = join(',', MyClass->required_names); # 'D,X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'D,Y' MySubClass->delete_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D,X,Y'; $r1 = join(',', MyClass->required_names); # 'D,X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'Y' MySubClass->inherit_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D,X,Y'; $r1 = join(',', MyClass->required_names); # 'D,X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'D,Y' MySubClass->delete_valid_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D,X,Y'; $r1 = join(',', MyClass->required_names); # 'D,X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,Y'; $r2 = join(',', MySubClass->required_names); # 'Y' MySubClass->inherit_valid_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,D,X,Y'; $r1 = join(',', MyClass->required_names); # 'D,X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'D,Y' MyClass->delete_valid_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,X,Y'; $r1 = join(',', MyClass->required_names); # 'X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,Y'; $r2 = join(',', MySubClass->required_names); # 'Y' MySubClass->add_required_name('D'); $v1 = join(',', MyClass->valid_names); # 'A,B,C,X,Y'; $r1 = join(',', MyClass->required_names); # 'X,Y' $v2 = join(',', MySubClass->valid_names); # 'A,C,D,Y'; $r2 = join(',', MySubClass->required_names); # 'D,Y' $h = MyClass->valid_names_hash; # This has no affect on the set. $h is not a reference to the # actual hash used for set storage. delete $h->{'C'}; $v1 = join(',', MyClass->valid_names); # 'A,B,C,X,Y'; $r1 = join(',', MyClass->required_names); # 'X,Y'
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 |