}
##### sub models
-sub friends { return shift->new_instance_of('::Users::Friends'); }
-sub prefs { return shift->new_instance_of('::Users::Prefs'); }
-sub configs { return shift->new_instance_of('::Users::Configs'); }
-sub achievements { return shift->new_instance_of('::Users::Achievements'); }
-sub passwords { return shift->new_instance_of('::Users::Passwords'); }
-sub info { return shift->new_instance_of('::Users::Info'); }
-sub acl { return shift->new_instance_of('::Users::ACL'); }
-sub acl2 { return shift->new_instance_of('::Users::ACL2'); }
-sub comments { return shift->new_instance_of('::Users::Comments'); }
-sub sidebar { return shift->new_instance_of('::Users::Sidebar'); }
-sub messages { return shift->new_instance_of('::Users::Messages'); }
-sub index { return shift->new_instance_of('::Users::Index'); }
-sub class { return shift->new_instance_of('::Users::Class'); }
-sub param { return shift->new_instance_of('::Users::Param'); }
-sub permissions { return shift->new_instance_of('::Users::Permissions'); }
+sub friends { return shift->_get_model("_friends", '::Users::Friends'); }
+sub prefs { return shift->_get_model("_prefs", '::Users::Prefs'); }
+sub configs { return shift->_get_model("_configs", '::Users::Configs'); }
+sub achievements { return shift->_get_model("_achievements", '::Users::Achievements'); }
+sub passwords { return shift->_get_model("_passwords", '::Users::Passwords'); }
+sub info { return shift->_get_model("_info", '::Users::Info'); }
+sub acl { return shift->_get_model("_acl", '::Users::ACL'); }
+sub acl2 { return shift->_get_model("_acl2", '::Users::ACL2'); }
+sub comments { return shift->_get_model("_comments", '::Users::Comments'); }
+sub sidebar { return shift->_get_model("_sidebar", '::Users::Sidebar'); }
+sub messages { return shift->_get_model("_messages", '::Users::Messages'); }
+sub index { return shift->_get_model("_index", '::Users::Index'); }
+sub class { return shift->_get_model("_class", '::Users::Class'); }
+sub param { return shift->_get_model("_param", '::Users::Param'); }
+sub permissions { return shift->_get_model("_permissions", '::Users::Permissions'); }
+
+sub _get_model {
+ my ($self, $name, $class) = @_;
+ return $self->{$name} ||= $self->new_instance_of($class);
+}
##### utility functions