[Moscow.pm] Mouse хочу странного
Ivan Petrov
i.petro.77.00 на gmail.com
Ср Окт 16 15:25:18 PDT 2013
есть допустим объект
package User;
use Mouse;
has name => is => 'ro', isa => 'Str';
далее роль у него составляющая некие списки юзеров
with 'User::List';
...
package User::List;
use Mouse::Role;
sub list {
... возвратит список пользователей
}
sub list_by_some {
... возвратит еще какой-то список
}
ну понятно
далее у юзеров могут быть допустим заказы. всю работу с заказами
выносим в отдельную роль (тут в примере работа со списками заказов)
package User::Order::List;
use Mouse::Role;
sub list_orders {
... возвратит список заказов пользователя
}
или игрушки
package User::Toy::List;
use Mouse::Role;
sub list_toys {
... возвратит игрушки пользователя
}
Ну вот, в большом проекте накапливается у некоторых сущностей много
разных ролей (или иерархия наследования, тут по разному можно
смотреть, это непринципиально).
и хочется писать далее не
$user->list_orders;
$user->list_toys;
а организовать нечто вроде неймспейсов ролевых.
то есть я хочу чтобы можно было написать
ns 'User::Order::List' => as => 'orders';
ns 'User::Toy::List' => as => 'toys';
в основном классе и далее чтобы можно было обращаться к его методам
так:
$user->orders->list;
$user->toys->list;
то есть очень похоже на контейнер, но это не контейнер.
это неймспейс.
функция $user->orders->list в качестве self должна получать объект $user.
то есть
has things => is => 'ro', isa => 'User::Thing::List';
тут не подходит. можно прослойку сделать на базе has конечно, но я
боюсь сильно просесть на бенчмарках.
что еще хочется:
- has внутри namespace
- в идеале наследования какого-то всей этой "хрени с которой
взлетать", но в целом наследование мы почти не применяем в Mouse,
поэтому не сильно актуально
я примерно представляю как такое написать, но
1. может быть кто-то писал уже подобное? дайте ссылку
2. сейчас сильно занят другими проектами, но если бы кто взялся мог бы
профинансировать появление подобного модуля на cpan :) с
документацией, тестами и сравнительными бенчмарками
(сравниваем с Mouse::Role). Пусть бенчмаркает вдвое хуже метода
Mouse::Role, но не хуже чем вдвое. Я думаю можно сделать чтобы
бенчмаркало соизмеримо.
кто что думает?
Подробная информация о списке рассылки Moscow-pm