perl - 如何在 'use base' 上的包中创建子例程?

标签 perl orm metaprogramming

我正在尝试创建一个用于 Mojolicious 网络应用程序的小型 ORM 库。我越来越喜欢 Ruby 的 Datamapper 库,如果可能的话,我想模拟它的一些行为。

在 Datamapper 中,您可以混合资源,然后将方法添加到您的类中,例如“all”等:

# User.rb
class User
    include Datamapper::Resource;
end
...

# Application.rb
users = User.all

对于我的库,我试图将一些包级功能添加到从基础模型继承的模块中,以实现类似的行为。

本质上,我希望能够做一些近似于以下的事情:

# User.pm
package User;
use base Model;
...

# Application.pm
my @users = User::all();

我已经四处寻找 perl 中的元编程示例,但没有发现任何立即有用的东西。

我所追求的是:

  • 以更惯用的方式实现类似优雅的替代 perl 模式
  • 能够在包级别和对象级别继承子例程
  • 能够在当前包的范围内“使用”时执行代码,或者
  • 将当前包传递给在“使用”时执行的代码
  • Perl 元编程指南
  • 支持轻松创建模拟适配器以及 DB2 和 MySQL 的现有声明性 ORM 库

理想情况下,我想尽可能避免在大字符串上运行 eval。

任何帮助将不胜感激:-)

最佳答案

Alternate perl patterns that achieve similar elegance in a more idiomatic fashion

Roles超越 mixins。

Ability to inherit subroutines on the package level, as well as the object level

角色通常在包级别使用,但也可以仅应用于实例。 (FIXME 怎么做?)

Ability to execute code on 'use' in the scope of the current package

import

Have the current package passed to code that is executed on 'use'

use 语句中的所有参数都作为参数传递给 import

A guide to meta-programming in Perl

Moose::Manual , Moose::Cookbook

A existing declarative ORM library that supports easily creating mock-adapters as well as DB2, and MySQL

DBIx::Class

关于perl - 如何在 'use base' 上的包中创建子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10663597/

相关文章:

javascript - Sequelize.js - 在不获取另一个对象的情况下在 save() 上添加关联

c++ - 与 typename 混淆,因此出现错误

types - Julia:是否可以将参数字典传递给函数?

ubuntu - 在 Ubuntu 14.04 上安装 Memcached::libmemcached 时出错

perl - 如何混淆我的 Perl 脚本以使其难以进行逆向工程?

python - 在 Django 中获取数据库类型

c++ - 当容器定义为 const 时,带有自定义迭代器的自定义容器不起作用

perl - Perl 中的非阻塞/异步执行

database - DBIx::Class::Schema::Loader ResultSource 基类

用于数据库支持集合的 Java 库