FuelPHPでアプリーションを作成する場合、Auth PackageのSimpleAuth等を使うかなと思います。
しかし、SimpleAuthそのままではとても使い勝手が悪いと思うこともあると思います。

例えば
  • メールアドレスが必須だけど、メールアドレスは必須にしたくない
  • ユーザー登録をするときにユーザー名が重複している場合の例外のメッセージが英語だけど日本語で例外を投げて欲しい
とかです。

そんな場合は、もともとのパッケージのclassを継承して、必要な部分だけ書き換えてあげるのがよいと思います。
 
※ErogameScapeを作っていて「継承」を使ったのは、CodeigniterでControllerクラスを継承してControllerを作成する程度のことだったのですが、ああ、継承ってこういう風に使えばいいんだ…便利なんだなあと思いました。

 「例えば」で書いたことを実現するために、FuelPHP1.4のSimpleAuthの場合、packages/auth/classes/auth/login/simpleauth.phpのcreate_userメソッドを書き換える必要があります。
create_userメソッドは以下のような書かれています。

public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
$password = trim($password);
$email = filter_var(trim($email), FILTER_VALIDATE_EMAIL); ← Validationクラスで検証するので消すことにします。ちなみに、私はこれを読むまでfilter_var関数を知りませんでした…。勉強になります。

if (empty($username) or empty($password) or empty($email)) ← Validationクラスで検証するのでこのif文は消すことにします。
{
throw new \SimpleUserUpdateException('Username, password or email address is not given, or email address is invalid', 1);
}

$same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))
->where('username', '=', $username)
->or_where('email', '=', $email) ← emailは必須とししないので、この条件を消すことにします。
->from(\Config::get('simpleauth.table_name'))
->execute(\Config::get('simpleauth.db_connection'));

if ($same_users->count() > 0)
{
if (in_array(strtolower($email), array_map('strtolower', $same_users->current()))) ← emailは必須とししないので、この条件を消すことにします。
{
throw new \SimpleUserUpdateException('Email address already exists', 2);
}
else
{
throw new \SimpleUserUpdateException('Username already exists', 3); ← 例外のメッセージを日本語にします。
}
}
以下略

それでは 「例えば」で書いたことを実現していきます。
ここからはFuelPHPのORMパッケージを拡張してみる。を真似しました。

fuel\packages下に以下のようにディレクトリを作成します。
\myauth\classes\auth\login

\myauth\に\auth\bootstrap.phpをコピーします。
\myauth\classes\auth\loginに\auth\classes\auth\login\simpleauthをコピーします。

\myauth\bootstrap.phpを以下のように編集します。
 
[オリジナル]

<?php

Autoloader::add_core_namespace('Auth');

Autoloader::add_classes(array(
'Auth\\Auth'           => __DIR__.'/classes/auth.php',
'Auth\\AuthException'  => __DIR__.'/classes/auth.php',

'Auth\\Auth_Driver'  => __DIR__.'/classes/auth/driver.php',

'Auth\\Auth_Acl_Driver'     => __DIR__.'/classes/auth/acl/driver.php',
'Auth\\Auth_Acl_SimpleAcl'  => __DIR__.'/classes/auth/acl/simpleacl.php',

'Auth\\Auth_Group_Driver'       => __DIR__.'/classes/auth/group/driver.php',
'Auth\\Auth_Group_SimpleGroup'  => __DIR__.'/classes/auth/group/simplegroup.php',

'Auth\\Auth_Login_Driver'          => __DIR__.'/classes/auth/login/driver.php',
'Auth\\Auth_Login_SimpleAuth'      => __DIR__.'/classes/auth/login/simpleauth.php',
'Auth\\SimpleUserUpdateException'  => __DIR__.'/classes/auth/login/simpleauth.php',
'Auth\\SimpleUserWrongPassword'    => __DIR__.'/classes/auth/login/simpleauth.php',
));

[編集後]
<?php

Autoloader::add_core_namespace('MyAuth');

Autoloader::add_classes(array(
'MyAuth\\Auth_Login_SimpleAuth'      => __DIR__.'/classes/auth/login/simpleauth.php',
));

namespaceを自分が命名したパッケージ名にして、add_classesには自分が編集するphpファイルの行を書きます。


\myauth\classes\auth\loginに\auth\classes\auth\login\simpleauthは以下のように編集しました。

[オリジナル]
<?php

namespace Auth;

中略

class Auth_Login_SimpleAuth extends \Auth_Login_Driver
{
中略 
 
public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
$password = trim($password);
$email = filter_var(trim($email), FILTER_VALIDATE_EMAIL);

if (empty($username) or empty($password) or empty($email))
{
throw new \SimpleUserUpdateException('Username, password or email address is not given, or email address is invalid', 1);
}

$same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))
->where('username', '=', $username)
->or_where('email', '=', $email)
->from(\Config::get('simpleauth.table_name'))
->execute(\Config::get('simpleauth.db_connection'));

if ($same_users->count() > 0)
{
if (in_array(strtolower($email), array_map('strtolower', $same_users->current())))
{
throw new \SimpleUserUpdateException('Email address already exists', 2);
}
else
{
throw new \SimpleUserUpdateException('Username already exists', 3);
}
}
以下略 

[編集後]
<?php

namespace MyAuth;

class Auth_Login_SimpleAuth extends \Auth\Auth_Login_SimpleAuth
{

public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
$password = trim($password);

$same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))
->where('username', '=', $username)
->from(\Config::get('simpleauth.table_name'))
->execute(\Config::get('simpleauth.db_connection'));

if ($same_users->count() > 0)
{
  throw new \SimpleUserUpdateException('入力頂いたユーザー名はすでにどなたがご使用です。', 3);    
}
 


\fuel\app\config\config.phpにmyauthパッケージを読みこむように設定を追加します。

/**************************************************************************/
/* Always Load                                                            */
/**************************************************************************/
'always_load'  => array(

/**
* These packages are loaded on Fuel's startup.
* You can specify them in the following manner:
*
* array('auth'); // This will assume the packages are in PKGPATH
*
* // Use this format to specify the path to the package explicitly
* array(
*     array('auth' => PKGPATH.'auth/')
* );
*/
'packages'  => array(
//'orm',
'auth',
 'myauth'
),


以上で、準備完了です。
あとは、普通にControllerから
$auth = Auth::instance();
$auth->create_user($data['input']['username'],$data['input']['password'],$data['input']['email']);
な感じて、 create_userを呼び出せば、myauthの方のcreate_userが呼び出されます。